package com.rtos.model.process.processDispatchAlgorithm;


import com.rtos.model.process.queue.ReadyQueue;
import com.rtos.model.process.Process;
import com.rtos.model.process.queue.RunningQueue;


/**
 * @Author: biubiu0002
 * @Date: 2021-10-08 0:57
 * 短程调度算法 时间片轮转
 **/
public class RoundRobin extends AbstractProcessDispatcher {

    /**
     * count%n
     * 适合于 结点数不变的情况
     * 进程轮询调度 应用 队列 的数据结构
     * ArrayList 手动实现 队列
     * <p>
     * 下标 = 第i个时间片 % 就绪队列的容量
     * 1%1=0 2%1=0
     * 3%2=1 4%2=0 5%2=1 6%2=0
     * 7%3=1 8%4=0 9%5=4 10%6=4 11%7=4 12%6=0 13%5=3 14%5 = 4 15%4=3
     *
     * @return
     */

    @Override
    public void processDispatchAlgorithm() {

        Process runningProcess = processDispatcher.getRunningProcess();
        Process hangoutProcess = processDispatcher.getHangoutProcess();

        /**
         * 经过CPU的 进程结束/时间片结束/IO结束 中断处理后，运行队列总是不为空，要么是一般进程，要么是闲逛进程。
         */
        if (runningProcess != hangoutProcess) {
            //一般进程正在运行
            return;
        }
        /**
         * 当前运行进程是闲逛进程
         */
        if (!ReadyQueue.getList().isEmpty()) {
            //正在闲逛 把闲逛进程撤出 新加入的一般进程换上到运行队列
            if (!RunningQueue.isEmpty()) {
                RunningQueue.remove();
            }
            //弹出就绪队列队头元素加入到运行队列
            Process process = ReadyQueue.pop();
            RunningQueue.add(process);
        }

    }
}
